// mutex测试：黄牛抢票实例

#include<stdio.h>
#include<pthread.h>
#include<unistd.h>

#define thread_count 2

// 全局变量（临界资源）
int g_tickets = 1000;
// 临界资源的互斥锁
pthread_mutex_t g_lock;

// 线程的入口函数
void* my_thread_start(void* arg)
{
    while(1)
    {
        // 修改临界资源：
        // 加锁
        pthread_mutex_lock(&g_lock);
        if(g_tickets <= 0)
        {
            pthread_mutex_unlock(&g_lock);
            break;
        }
        printf("this is pthread: %p, g_tickets has: %d, i get one\n",(void*)pthread_self(), g_tickets);
        g_tickets--;
        // 解锁
        pthread_mutex_unlock(&g_lock);
        sleep(1);
    }
    return NULL;
}

int main()
{
    //1.初始化互斥锁
    pthread_mutex_init(&g_lock, NULL);

    //2.创建多个线程
    //2.1储存创建的每个线程tid
    pthread_t tid[thread_count];
    int i = 0;
    for(i = 0; i < thread_count; i++)
    {
        int ret = pthread_create(&tid[i], NULL, my_thread_start, NULL);
        if(ret < 0)
        {
            perror("pthread_create\n");
            return 0;
        }
    }
    // 3.主线程：不能在工作线程前退出，可进行线程等待
    for(i = 0; i < thread_count; i++)
    {
        pthread_join(tid[i], NULL);
    }
    // 4.销毁锁
    pthread_mutex_destroy(&g_lock);
    
    return 0;
}
